Имеется реализованная однопочная программа для задачи Sor3D. Которая проводит итеративные вычисления над заранее созданной матрицей. Необходимо расспараллелить эти вычисления.
Требуется:
Весь код и используемые файлы можно найти тут(кликабельно)
При подготовке к расспараллеливанию:
Реализовано:
TODO
Было произведенно 5 запусков для каждого типа матриц и количества параллельных потоков выполнения.
Были взяты матрицы по сторонами 66, 130, 258, 514, 1026.
Запуски осуществлялись в 1, 2, 4, 8, 16, 32, 64, 128, 160 потоках.
Данные были сохранены в файлах test.out.<номер запуска в очереди Polus>. Впоследствии все файлы были скачаны с помощью scp и теперь с их помощью будут построены графики.
import pandas as pd
import os
files_dir = "edu-cmc-skpod21-321-18"
file_names = [name for name in os.listdir(files_dir) if name.startswith("test.out.")]
string_before_data = 'The output (if any) follows:'
data = [] # content of texts
df = pd.DataFrame()
for name in file_names:
with open(files_dir + os.sep + name, 'r', encoding="UTF-8") as file:
text = list(filter(lambda x: len(x) > 0, file.read().split("\n")))
ind = text.index(string_before_data) + 1
df = df.append(list(map(lambda x: [int(x[0]), int(x[1]), float(x[2])], map(lambda x: x.split(), text[ind:ind + 9]))), ignore_index=True)
df.rename(columns={0:"Matrix side size",1:"Thread number",2:"Execution time"}, inplace=True)
df["Thread number"].unique()
# df
array([ 1, 2, 4, 8, 16, 32, 64, 128, 160], dtype=int64)
graph_data = df.groupby(["Matrix side size","Thread number"]).mean().reset_index()
graph_data[::4]
| Matrix side size | Thread number | Execution time | |
|---|---|---|---|
| 0 | 66 | 1 | 0.141506 |
| 4 | 66 | 16 | 0.025076 |
| 8 | 66 | 160 | 0.054042 |
| 12 | 130 | 8 | 0.258060 |
| 16 | 130 | 128 | 5.400434 |
| 20 | 258 | 4 | 3.150660 |
| 24 | 258 | 64 | 0.978000 |
| 28 | 514 | 2 | 46.277527 |
| 32 | 514 | 32 | 7.739658 |
| 36 | 1026 | 1 | 784.680268 |
| 40 | 1026 | 16 | 84.431072 |
| 44 | 1026 | 160 | 62.467332 |
import plotly.graph_objects as go
import numpy as np
fig = go.Figure(data=[
go.Mesh3d(
x=graph_data['Matrix side size'].tolist(),
y=graph_data['Thread number'].tolist(),
z=graph_data['Execution time'].tolist(),
colorbar_title='z',
colorscale=[[0, 'gold'],
[0.5, 'mediumturquoise'],
[1, 'magenta']],
intensity = np.linspace(0, 44, 48, endpoint=True),
showscale=True
)
])
fig.update_layout(scene = dict(
xaxis_title='Matrix side size',
yaxis_title='Thread number',
zaxis_title='Execution time'),
width=900,
margin=dict(r=20, b=10, l=10, t=10))
print("Graph with all collected data")
fig.show()
Graph with all collected data
import plotly.graph_objects as go
import numpy as np
graph_data_few = graph_data[graph_data['Execution time'] < 100]
fig = go.Figure(data=[
go.Mesh3d(
x=graph_data_few['Matrix side size'].tolist(),
y=graph_data_few['Thread number'].tolist(),
z=graph_data_few['Execution time'].tolist(),
colorbar_title='z',
colorscale=[[0, 'gold'],
[0.5, 'mediumturquoise'],
[1, 'magenta']],
intensity = np.linspace(0, 44, 44, endpoint=True),
showscale=True
)
])
fig.update_layout(scene = dict(
xaxis_title='Matrix side size',
yaxis_title='Thread number',
zaxis_title='Execution time'),
width=900,
margin=dict(r=20, b=10, l=10, t=10))
print("Graph with data where 'Execution time' < 100 seconds")
fig.show()
Graph with data where 'Execution time' < 100 seconds
Исходя из нарисованных графиков на основе собранных и усреднённых данных можно сделать вывод о существовании некоторых закономерностей:
TODO
Выполнена работа по разработке параллельной версии программы для задачи Sor3D. Изучена технология написания параллельных алгоритмов OpenMP. Проанализировано время выполнения алгоритмов на вычислительной системе Polus. Технология OpenMP достаточно удобна в использовании и даёт значительный прирост производительности на рассчитанных на многопоточные вычисления системах.
Анализ MPI - TODO
Сравнение OpenMP & MPI - TODO